home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / netinfo_rpc.nasl < prev    next >
Text File  |  2005-01-14  |  5KB  |  195 lines

  1. #
  2. # This script is (C) Tenable Network Security
  3. #
  4.  
  5. if(description)
  6. {
  7.  script_id(11899);
  8.  script_version("$Revision: 1.3 $");
  9.  
  10.  name["english"] = "nibindd is running";
  11.  
  12.  script_name(english:name["english"]);
  13.  
  14.  desc["english"] = "
  15. This script determines of the nibindd rpc service is running,
  16. in which case it connects to it to extract the list of NetInfo
  17. domains the remote host is serving
  18.  
  19. Solution : Filter incoming traffic to this port
  20. Risk factor : Medium";
  21.  
  22.  
  23.  script_description(english:desc["english"]);
  24.  
  25.  summary["english"] = "Connects to the remote nibindd RPC service";
  26.  
  27.  script_summary(english:summary["english"]);
  28.  
  29.  script_category(ACT_GATHER_INFO);
  30.  
  31.  script_copyright(english:"This script is Copyright (C) 2003 Tenable Network Security");
  32.  family["english"] = "RPC";
  33.  script_family(english:family["english"]);
  34.  script_dependencies("rpc_portmap.nasl");
  35.  exit(0);
  36. }
  37.  
  38. function get_rpc_port(protocol)
  39.  local_var    broken, req, soc, r, port;
  40.  local_var    a, b, c, d, p_a, p_b, p_c, p_d, pt_a, pt_b, pt_c, pt_d;
  41.  
  42.  
  43.  
  44.  a = rand() % 255;
  45.  b = rand() % 255;
  46.  c = rand() % 255;
  47.  d = rand() % 255;
  48.  
  49.  p_a = program / 16777216;     p_a = p_a % 256;
  50.  p_b = program / 65356;     p_b = p_b % 256;
  51.  p_c = program / 256;       p_c = p_c % 256;
  52.  p_d = program % 256;
  53.  
  54.  pt_a = protocol / 16777216; pt_a = pt_a % 256;
  55.  pt_b = protocol / 65535   ; pt_b = pt_b % 256;
  56.  pt_c = protocol / 256;    ; pt_c = pt_c % 256;
  57.  pt_d = protocol % 256;
  58.  
  59.  
  60.  req = raw_string(a,     b,     c,     d,     # XID
  61.            0x00, 0x00, 0x00, 0x00,    # Msg type: call
  62.           0x00, 0x00, 0x00, 0x02,    # RPC Version
  63.           0x00, 0x01, 0x86, 0xA0,    # Program
  64.           0x00, 0x00, 0x00, 0x02,    # Program version
  65.           0x00, 0x00, 0x00, 0x03,    # Procedure
  66.           0x00, 0x00, 0x00, 0x00,    # Credentials - flavor
  67.           0x00, 0x00, 0x00, 0x00,     # Credentials - length
  68.           0x00, 0x00, 0x00, 0x00,    # Verifier - Flavor
  69.           0x00, 0x00, 0x00, 0x00,    # Verifier - Length
  70.           
  71.           0x0b, 0xed, 0x48, 0xa1,    # Program
  72.           0xFF, 0xFF, 0xFF, 0xFF,    # Version (any)
  73.           pt_a, pt_b, pt_c, pt_d,    # Proto (udp)
  74.           0x00, 0x00, 0x00, 0x00    # Port
  75.            );
  76.     
  77.       
  78.   port = int(get_kb_item("rpc/portmap"));
  79.   if(port == 0)port = 111;
  80.        
  81.       
  82.  broken = get_kb_item(string("/tmp/rpc/noportmap/", port));
  83.  if(broken)return(0);
  84.  
  85.        
  86.  soc = open_sock_udp(port);
  87.  send(socket:soc, data:req);
  88.  r = recv(socket:soc, length:1024);
  89.  
  90.  close(soc);
  91.  if(!r)
  92.  {
  93.   set_kb_item(name:string("/tmp/rpc/noportmap/", port), value:TRUE);
  94.   return(0);
  95.  }
  96.  
  97.  if(strlen(r) < 28)
  98.   return(0);
  99.  else
  100.   {
  101.    p_d = ord(r[27]);
  102.    p_c = ord(r[26]);
  103.    p_b = ord(r[25]);
  104.    p_a = ord(r[24]);
  105.    port = p_a;
  106.    port = port * 256;
  107.    port = port +p_b; 
  108.    port = port * 256;
  109.    port = port + p_c; 
  110.    port = port * 256;
  111.    port = port + p_d;
  112.    return(port);
  113.   }
  114. }
  115.  
  116.  
  117.  
  118.  
  119.  
  120. function netinfo_recv(socket)
  121. {
  122.  local_var buf, len;
  123.  
  124.  buf = recv(socket:soc, length:4);
  125.  if(strlen(buf) < 4)return NULL;
  126.  
  127.  len = ord(buf[3]) + ord(buf[2])*256;
  128.  
  129.  buf += recv(socket:soc, length:len);
  130.  return buf;
  131. }
  132.  
  133.  
  134.  
  135.  
  136. rpcport = get_rpc_port(protocol:IPPROTO_TCP);
  137. if ( !rpcport ) exit(0);
  138. if ( !get_port_state(rpcport)) exit(0);
  139.  
  140. soc = open_sock_tcp(rpcport);
  141. if ( ! soc ) exit(0);
  142.  
  143. req = raw_string(0x80, 0x00, 0x00, 0x28, 0x11, 0xe0, 0x40, 0x95,
  144.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  145.          0x0b, 0xed, 0x48, 0xa1, 0x00, 0x00, 0x00, 0x01,
  146.          0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
  147.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  148.          0x00, 0x00, 0x00, 0x00);
  149.  
  150. send(socket:soc, data:req);
  151. r = netinfo_recv(socket:soc);
  152. close(soc);
  153. if(strlen(r) < 35)exit(0);
  154.  
  155. num_domains = ord(r[35]);
  156. start = 38;
  157.  
  158. report = "";
  159. for ( i = 0 ; i < num_domains ; i ++ )
  160. {
  161.  len = ord(r[start]) * 256 + ord(r[start+1]);
  162.  start += 2;
  163.  report += '\n . ' + substr(r, start, start + len - 1);
  164.  start += len;
  165.  if(len % 4)start += 4 - (len % 4);
  166.  start += 2;
  167.  udp = ord(r[start]) * 256 + ord(r[start+1]);
  168.  start += 4;
  169.  tcp = ord(r[start]) * 256 + ord(r[start+1]);
  170.  report += ' (serving on tcp port ' + tcp + ' and udp port ' + udp + ')';
  171.  start += 4;
  172. }
  173.  
  174.  
  175. if ( strlen(report) )
  176.  report = "
  177. The remote host is running the nibindd RPC service, which implies that it
  178. is a NetInfo server (so it is probably running MacOS X or NeXT). It serves
  179. the following list of domains : 
  180. " + report +
  181. "
  182.  
  183. An attacker might use this information to gather the relevant
  184. maps from the remote system, like the password file or the configuration
  185. of the domain.
  186.  
  187. Solution : filter incoming traffic to this port. If the remote host is not a
  188. NetInfo server, kill the 'nibindd' service.
  189. Risk factor : Medium";
  190.  
  191.  security_warning(port:rpcport, data:report);
  192. }
  193.